#ifndef _vector_h
#define _vector_h

#include <iostream>
#include "tporo.h"
using namespace std;

/** \file tvectorporo.h
* \brief Clase TVectorPoro
* Definicion de la clase TVectorPoro
*/

/** \class TVectorPoro
* \brief Clase TVectorPoro
* Clase completa para construir TVectorPoro
*/
class TVectorPoro
{
    friend class TABBPoro;
	private:
		/** \brief int dimension.
		* Variable que representa la dimension.
		*/
		int dimension;
                
                /** \brief Tporo *datos.
		* Variable que es un puntero a un Poro.
		*/
		TPoro *datos;
                
		/** \brief Tporo error.
		* Variable que representa un poro erroneo.
		*/
		TPoro error;
	public:
		/** \brief Constructor por defecto.
		* Construye el objeto TVectorPoro.
		*/
		TVectorPoro();

		/** \brief Constructor a partir de una dimension.
		* Contruye el objeto TVectorPoro a partir de una dimension.
                 * \param tam la dimension
		*/
		TVectorPoro(const int);

		/** \brief Constructor de copia TVectorPoro.
		* Pasadas una dimension, un puntero TPoro y un error TPoro, se contruye el objeto con esos datos.
		* \param t Objeto a copiar.
		*/
		TVectorPoro(const TVectorPoro &);

		/** \brief Destructor TVectorPoro.
		* Destruye el objeto TVectorPoro.
		*/
		~TVectorPoro();

		/** \brief Sobrecarga del operador asignacion.
		* Sobrecarga el operador igual de asignacion para dos objetos TVectorPoro.
		* \param t objeto del cual copiar.
		*/
		TVectorPoro &operator=(const TVectorPoro &);

		/** \brief Sobrecarga operador igualldad.
		* Sobrecarga el operador igualdad para comparar dos TVectorPoro objetos.
		* \param t objeto a comparar.
		* \return devuelve un booleano con verdadero si los dos vectores son iguales.
		*/
		bool operator==(const TVectorPoro &);

		/** \brief Sobrecarga operador desigualldad.
		* Sobrecarga el operador desigualdad para comparar dos TVectorPoro objetos.
		* \param t objeto a comparar.
		* \return devuelve un booleano con verdadero si los dos vectores son desiguales.
		*/
		bool operator!=(const TVectorPoro &);

		/** \brief Sobrecarga el operador corchete (parte izquierda).
		* Sobrecarga el operador corchete por la izquierda ( l-hand ).
                 * \param pos posicion del objeto en el vector
		* \return devuelve el objeto TPoro.
		*/
		TPoro &operator[](const int i);

		/** \brief Sobrecarga el operador corchete (parte derecha).
		* Sobrecarga el operador corchete por la derecha ( r-hand ).
                 * \param pos posicion del objeto en el vector
		* \return, devuelve el valor TPoro.
		*/
		TPoro operator[](const int i) const;

		/** \brief Devuelve el valor de la longitud (dimension) del vector.
		* Devuelve el valor de la dimension del vector.
		* \return devielve el valor dimension.
		*/
		int Longitud() const;

		/** \brief Devuelve el valor de la cantidad de posiciones ocupadas (no vacias) en el vector.
		* Devuelve el valor de la cantidad de posiciones ocupadas del vector.
		* \return devielve de la cantidad de posiciones ocupadas.
		*/
		int Cantidad() const;

		/** \brief Redimensiona el vector al tamaño del entero pasado.
		* Redimensiona el vector al tamaño del entero pasado.
                * \param tam tamaño nuevo del vector
		* \return devuelve si se ha o no se ha producido el redimensioanamiento en el vector.
		*/
		bool Redimensionar(const int);
		
		/** \brief Operator salida
		* Saca por pantalla los elementos del vector entre []
                * \param os tipo ostream &
                * \param t objeto poro
                * \return ostream&
                */
		friend ostream & operator<<(ostream &,const  TVectorPoro &);
};
#endif
